/*
 *   CONTROL AGV
 *
 */

#include "../common/Argv.h"
#include "../common/StringUtils.h"
#include "../logger/logger.h"
#include "../application/AgvAPI.h"
#include "../application/MapaPiezasProducto.h"
/*
 * Uso: ./agv <zona=izq|med|der>
 */
int main(int argc, char* argv[]) {
	CLogger::create("Robot AGV");
	CLogger::setLevel(LogLevelEnum::TRACE);
	CLogger::log("Empieza a simular.", LogLevelEnum::INFO);

	Argv args(argv);
	if (args.getArgc() < 3) {
		CLogger::log("Parámetros inválidos. Uso: ./agv <zona=izq|med|der> hostName", LogLevelEnum::FATAL);
		exit(1);
	}

	AdminKeys adminKeys(args.getArg(1), "");
	RobotAgvAPI api(adminKeys, args.getArg(2));

	while (true) {
		CLogger::log("Esperando un pedido de piezas.", LogLevelEnum::INFO);
		std::vector<TipoPieza> piezas = api.atenderPedidoPiezas();
		CLogger::log("Llegó un nuevo pedido de piezas", LogLevelEnum::INFO);
		std::vector<TipoPieza>::iterator it;
		for(it = piezas.begin(); it != piezas.end(); it++) {
			sleep(2);
			TipoPieza pieza = *it;
			CLogger::log("Proceso la pieza "+ StringUtils::NumberToString(pieza), LogLevelEnum::INFO);
			EstadoCanasto estado = api.getEstadoCanasto(pieza);
			int posCanasto = estado.posicion;
			int posReemplazo = 0;
			if (estado.ausente) {
				CLogger::log("No está el canasto.", LogLevelEnum::INFO);
				posReemplazo = api.buscarPosicionReemplazo();
			} else {
				CLogger::log("El canasto está vacío.", LogLevelEnum::INFO);
				if(estado.estaVacio) {
					posReemplazo = posCanasto;
				} else {
					CLogger::log("El canasto está y tiene piezas, ignoro pedido.", LogLevelEnum::INFO);
					continue;
				}
			}
			if (posReemplazo == TODOS_OCUPADOS) {
				CLogger::log("Todos los canastos están ocupados.", LogLevelEnum::INFO);
			} else {
				CLogger::log("Va a reemplazar canasto en posicion."+StringUtils::itos(posReemplazo), LogLevelEnum::INFO);
				api.reemplazarCanasto(pieza, posReemplazo);
			}
		}
	}
	return 0;
}
